package com.mengya.locks;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @ClassName ReEntryLockDemo
 * @Description 指的是可重复可递归调用的锁，在外层使用锁之后，在内层仍然可以使用并且不发生死锁，这样的锁就叫做可重入锁。
 * 简单来说就是：在synchronized修饰的方法或代码块的内部调用本类的其他synchronized修饰的方法或代码块时，是永远可以得到锁。
 * @Author xiongwei.wu
 * @Date 2023/1/5 16:29
 **/
public class ReEntryLockDemo {

    static Object objectLock = new Object();

    public static void main(String[] args) {
        Lock lock = new ReentrantLock();

        new Thread(() -> {
            lock.lock();
            try {
                System.out.println(Thread.currentThread().getName() + "\t" + "-----------外层");
                lock.lock();
                try {
                    System.out.println(Thread.currentThread().getName() + "\t" + "-----------内层");
                } finally {
                    lock.unlock();
                }
            } finally {
                lock.unlock();
            }
        }, "t1").start();
    }

    /**
     * 同步方法 可重入锁又名递归锁，支持递归
     */
    public synchronized void m1() {
        m1();
    }

    /**
     * 同步代码块演示可重入锁
     */
    private static void syncBlock() {
        new Thread(() -> {
            synchronized (objectLock) {
                System.out.println("---------外层");
                synchronized (objectLock) {
                    System.out.println("---------中层");
                    synchronized (objectLock) {
                        System.out.println("---------内层");
                    }
                }
            }
        }, "t1").start();
    }
}
